import { RouteRecordRaw } from 'vue-router';
import router from '@/router'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import { getToken } from '@g/utils/auth'
import getPageTitle from '@g/utils/get-page-title'
import defaultSettings from '@g/settings';
import { usePermissionStore } from '@/store/permission';
import { useUserStore } from '@/store/user';
const { permissionType, permissionListKey } = defaultSettings

NProgress.configure({ showSpinner: false }) // NProgress 配置

// 白名单 不需要重定向的
const whiteList = ['/login', 'auth-redirect']

router.beforeEach(async (to, from, next)=>{ 
  // progress 开始
  NProgress.start()

  // 设置页面标题
  document.title = getPageTitle(to.meta.title)

  // 判断是否登录了
  const hasToken = getToken()

  // 判断是否带有确定是未登录状态的参数
  const isNoLogin = (to.query.auth && Number(to.query.auth) === 2) ? true : false

  if (hasToken) {
    if (to.path === '/login') {
      if (isNoLogin) {
        // 确定没有登录 去登录页
        next()
      } else {
        // 如果已经登录了，重定向到首页
        next({ path: '/' })
      }
      NProgress.done()
    } else {
      const userStore = useUserStore()
      const permissionStore = usePermissionStore()
      // 确定用户是否通过getInfo获得了他的权限
      let isGet = false
      if (permissionType === 'role') {
        isGet = userStore.userInfo && userStore.userInfo.roles && userStore.userInfo.roles.length > 0
      } else if (permissionType === 'routeId') {
        isGet = userStore.userInfo && userStore.userInfo[permissionListKey]
      }

      if (isGet) next()
      else {
        // 获取用户信息
        await useUserStore().getUserInfo()
        // 通过权限获取路由列表
        const accessRoutes: RouteRecordRaw[] = await permissionStore.generateRoutes() as RouteRecordRaw[]

        // 将有权限路由列表添加到router中
        accessRoutes.forEach((item: RouteRecordRaw) => router.addRoute(item))
        
        // hack 方法以确保addRoute完成
        // 设置replace：true，因此导航不会留下历史记录
        next({ ...to, replace: true })
      }
    }
  } else {
    // 没有token
    if (whiteList.indexOf(to.path) !== -1) {
      // 如果在白名单 直接进入
      next()
    } else {
      // 否则到登录页
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
}) 

router.afterEach((to,from)=>{ 
  NProgress.done()
}) 